前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

很多情况下,我们可能需要在获取或更新缓存时执行一些额外操作,Workbox 的插件通过一系列生命周期函数(比如:cacheWillUpdate)为我们提供了可在请求的生命周期内,以操作请求、响应的方式来控制并添加额外行为的机制,本章我们将对其进行详细介绍。

# 内置插件

Workbox 内置了一些插件以满足我们的日常开发需求,它们分别是:

  • workbox.backgroundSync.Plugin:用于后台同步;如果网络请求失败,该请求将会被添加到后台同步队列中,并在触发下一个同步事件时重试该请求。
  • workbox.broadcastUpdate.Plugin:用于广播通知;如果缓存被更新,将在 Broadcast Channel 或通过调用 postMessage 来发送通知给订阅者。
  • workbox.cacheableResponse.Plugin:用于判断请求是否可以被缓存;通过该插件,可以只缓存满足指定条件的请求响应。
  • workbox.expiration.Plugin:用于控制缓存的有效期。
  • workbox.rangeRequests.Plugin:通过该插件,可要求 Service Worker 只返回响应的部分内容。 我们已经在前面的章节中对 workbox.backgroundSync.Plugin、workbox.broadcastUpdate.Plugin、workbox.cacheableResponse.Plugin 及 workbox.expiration.Plugin 进行了介绍,此处不再重述,本节的剩余部分,我们将对 workbox.rangeRequests.Plugin 的使用进行讨论。

# Range 请求

播放音视频时,我们往往需要边播边下载以减少用户等待时间,此时便可在请求中添加 Range 头来告知服务器只返回资源的指定部分,其格式如下:

Range: <unit>=<range-start>-<range-end>
@前端进阶之旅: 代码已经复制到剪贴板
  • <unit>:范围单位(通常为 bytes)。
  • <range-start>:指定单位下,范围的起始值(类型为整数)。
  • <range-end>:指定单位下,范围的结束值(类型为整数),如不指定此值,则表示范围的结束值为资源的末尾。

如果服务器返回的是 Range 响应,状态码为 206(Partial Content);如请求不合法,服务器返回的状态码为 416(Range Not Satisfiable);如果服务器忽略 Range 头,返回整个资源,其状态码为 200。

# workbox.rangeRequests.Plugin

当我们使用缓存来响应包含 Range 头的请求时,Cache API 将忽略 Range 设置并返回完整的资源,基于此,我们往往使用 workbox.rangeRequests.Plugin 来返回资源指定范围的内容。比如:

workbox.routing.registerRoute(
  /\.mp4$/,
  new workbox.strategies.CacheFirst({
    plugins: [
      new workbox.rangeRequests.Plugin()
    ]
  });
);
@前端进阶之旅: 代码已经复制到剪贴板

同其他内置插件一样,我们可以使用 workbox.rangeRequests.createPartialResponse 在自定义的请求策略中处理 Range 请求,比如:

const response = await workbox.rangeRequests.createPartialResponse(request, cachedResponse);
@前端进阶之旅: 代码已经复制到剪贴板

需要注意的是,参数 request 必须包含 Range 头,否则将抛出 No Range header was found in the Request provided. 异常。

# 自定义插件

我们可以通过创建包含以下方法的对象来构建自定义插件:

  • cacheWillUpdate:方法签名为:({request, response, event}) => Promise<Response|null>,该方法
fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
  • React专栏

    • React组合式开发实战

      • 前端开发的四个时代
      • 企业管理系统的前世今生
      • 可视化页面搭建工具
      • 实战篇 01:开发前准备
      • 实战篇 02:项目脚手架
      • 实战篇 03:页面布局方案
      • 实战篇 04:权限管理机制
      • 实战篇 05:菜单匹配逻辑
      • 实战篇 06:消息通知设计
      • 实战篇 07:多语言支持
      • 继往开来:可视化页面搭建工具
    • React Hooks与Immutable实战

    • React SSR服务端渲染与同构实践

    • IM聊天系统前端开发实践

    • 微前端开发实战

    • React进阶实践

  • Vue专栏

  • 移动端专栏

  • Node专栏

  • 前端工程化专栏

  • 算法专栏

  • Typescript专栏

  • 其他专栏